USE [Bases2]
GO
/****** Object:  StoredProcedure [dbo].[CobroCheque]    Script Date: 12/01/2011 13:31:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[CobroCheque]
    @cuenta_origen int,  
    @cheque int,  
    @monto float,
    @agencia int
AS 
BEGIN
	SET NOCOUNT ON
	BEGIN TRANSACTION
	
	DECLARE @contador int;
	SET @contador=0	;
	
	SELECT @contador=COUNT(1)
	FROM CUENTA
	WHERE id_cuenta=@cuenta_origen 	
	
	IF @contador<=0
	BEGIN
		SELECT 'El numero de cuenta ['+CAST(@cuenta_origen as varchar)+'] no existe.';				
	END
	ELSE
	BEGIN
		SELECT @contador=COUNT(1)
		FROM BANCO
		INNER JOIN CUENTA ON BANCO.id_banco= CUENTA.id_banco 
		INNER JOIN TIPO_CUENTA ON CUENTA.id_tipo_cuenta=TIPO_CUENTA.id_tipo_cuenta
		INNER JOIN CLIENTE_CUENTA ON CLIENTE_CUENTA.id_cuenta=CUENTA.id_cuenta
		INNER JOIN CLIENTE ON CLIENTE.id_cliente=CLIENTE_CUENTA.id_cliente
		INNER JOIN TIPO_CLIENTE ON TIPO_CLIENTE.id_tipo_cliente=CLIENTE.id_tipo_cliente
		INNER JOIN ESTADO_CUENTA ON ESTADO_CUENTA.id_cuenta=CUENTA.id_cuenta
		WHERE (ESTADO_CUENTA.id_tipo_estado=0 OR ESTADO_CUENTA.id_tipo_estado=1)
		AND ESTADO_CUENTA.estado=1
		AND CUENTA.id_cuenta=@cuenta_origen 
		
		IF @contador>0
		BEGIN
			SELECT 'La cuenta ['+CAST(@cuenta_origen as varchar)+'] se encuentra bloqueada o cancelada.';			
		END
		ELSE
		BEGIN
			DECLARE @DepositosCompensados decimal (18,2), @Debitos decimal (18,2), @Diferencia decimal (18,2)			
			
			SELECT @DepositosCompensados=SUM(monto)
			FROM DEPOSITO
			INNER JOIN CUENTA ON CUENTA.id_cuenta=DEPOSITO.id_cuenta
			WHERE CUENTA.id_cuenta=@cuenta_origen
			AND DEPOSITO.compensado=1												
			
			SELECT @Debitos=SUM(monto)
			FROM DEBITO
			INNER JOIN CUENTA ON CUENTA.id_cuenta=DEBITO.id_cuenta
			WHERE CUENTA.id_cuenta=@cuenta_origen
			
			SET @Diferencia= ISNULL(@DepositosCompensados,0)-ISNULL(@Debitos,0)
			
			IF @Diferencia<@monto
			BEGIN
				SELECT 'La cuenta ['+CAST(@cuenta_origen as varchar)+'] no cuenta con el monto necesario.'								
			END
			ELSE
			BEGIN
				SELECT @Contador=COUNT(1)
				FROM CHEQUE
				INNER JOIN CHEQUERA ON CHEQUE.id_chequera=CHEQUERA.id_chequera
				INNER JOIN CUENTA ON CUENTA.id_cuenta=CHEQUERA.id_cuenta
				WHERE CUENTA.id_cuenta=@cuenta_origen
				AND CHEQUE.id_cheque=@cheque
				
				IF @Contador<=0
				BEGIN
					SELECT 'No existe asignado un cheque numero ['+CAST(@cheque as varchar)+'] que pertenezca a la cuenta ['+CAST(@cuenta_origen as varchar)+'].'												
				END
				ELSE
				BEGIN
					SELECT @Contador=COUNT(1)
					FROM CHEQUE
					WHERE cobrado=1	
					AND id_cheque=@cheque							
										
					IF @Contador>0
					BEGIN
						SELECT 'El cheque numero ['+CAST(@cheque as varchar)+'] ya se ha cobrado.'						
					END
					ELSE
					BEGIN
						SELECT @Contador=COUNT(1)
						FROM ESTADO_CHEQUE
						WHERE estado=1
						AND id_cheque=@cheque
						
						IF @Contador>0
						BEGIN							
							SELECT 'El cheque numero ['+CAST(@cheque as varchar)+'] se encuentra bloqueado.'
						END
						ELSE
						BEGIN		
							SET @contador=-1										
							SELECT TOP(1) @contador=DEBITO.id_debito
							FROM DEBITO
							ORDER BY DEBITO.id_debito DESC
							
							IF @contador IS NULL
							BEGIN
								SET @contador=-1
							END
							
							SET @contador=@contador+1
											
							INSERT INTO DEBITO VALUES(@contador,@monto,@agencia,@cuenta_origen)
							
							UPDATE CHEQUE 
							SET cobrado=1,id_deposito=@contador
							WHERE id_cheque=@cheque
							
							
														
							/**********BITACORA*************/
							DECLARE @Diferencia2 decimal (18,2)
							SELECT @DepositosCompensados=SUM(monto)
							FROM DEPOSITO
							INNER JOIN CUENTA ON CUENTA.id_cuenta=DEPOSITO.id_cuenta
							WHERE CUENTA.id_cuenta=@cuenta_origen
							AND DEPOSITO.compensado=1												
							
							SELECT @Debitos=SUM(monto)
							FROM DEBITO
							INNER JOIN CUENTA ON CUENTA.id_cuenta=DEBITO.id_cuenta
							WHERE CUENTA.id_cuenta=@cuenta_origen
							
							SET @Diferencia2= ISNULL(@DepositosCompensados,0)-ISNULL(@Debitos,0)
							
							SET @contador=-1							
							SELECT TOP(1) @contador=BITACORA.id_bitacora
							FROM BITACORA
							ORDER BY BITACORA.id_bitacora DESC
							
							IF @contador IS NULL
							BEGIN
								SET @contador=-1
							END
							
							SET @contador=@contador+1							
							
							INSERT INTO BITACORA VALUES(@contador,GETDATE(),2,@cuenta_origen,@Diferencia,@monto,@Diferencia2,'Se pago el cheque ['+CAST(@cheque as varchar)+']')
							/**********BITACORA*************/
							
							SELECT 'Debito realizada correctamente.'
						END
					END
				END										
			END				
		END
	END	
	
	COMMIT
	SET NOCOUNT OFF
END
